//@version=4
study(title="Infinity Algo", shorttitle="Infinity Algo beta", overlay=true)

// --- First Part: Super Trend V ---

source = close
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol = (volume / hilow)
spreadvol = (openclose * vol)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high - low, window_len)

v = spreadvol + cum(spreadvol)
smooth = sma(v, v_len)
v_spread = stdev(v - smooth, window_len)
shadow = (v - smooth) / v_spread * price_spread

out = shadow > 0 ? high + shadow : low + shadow

src = out
src1 = open
src2 = low
src3 = high
tf = input(720)
len = timeframe.isintraday and timeframe.multiplier >= 1 ? 
      tf / timeframe.multiplier * 7 : 
      timeframe.isintraday and timeframe.multiplier < 60 ? 
      60 / timeframe.multiplier * 24 * 7 : 7

c = ema(src, len)
plot(c, color=color.red)
o = ema(src1, len)
plot(o, color=color.blue)

col = c > o ? color.lime : color.orange
vis = true
vl = c
ll = o
m1 = plot(vl, color=col, linewidth=1, transp=60)
m2 = plot(vis ? ll : na, color=col, linewidth=2, transp=80)

fill(m1, m2, color=col, transp=70)

vpt = ema(out, len)

st_mult = input(1, title='SuperTrend Multiplier', minval=0, maxval=100, step=0.01)
st_period = input(10, title='SuperTrend Period', minval=1)

up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend = 0.0
up_trend := close[1] > up_trend[1] ? max(up_lev, up_trend[1]) : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

trend = 0
trend := close > down_trend[1] ? 1 : close < up_trend[1] ? -1 : nz(trend[1], 1)

st_line = trend == 1 ? up_trend : down_trend

plot(st_line[1], color=trend == 1 ? color.green : color.red, style=plot.style_cross, linewidth=2, title="SuperTrend")

buy = crossover(close, st_line) and close > o
sell = crossunder(close, st_line) and close < o

plotshape(buy, title="buy", text="Buy", color=color.green, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)
plotshape(sell, title="sell", text="Sell", color=color.red, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)

multiplier = input(title="TP", type=input.float, defval=2, minval=1)
src5 = close
len5 = input(title="TP length", defval=150, minval=1)
offset = 0

calcSlope(src5, len5) =>
    sumX = 0.0
    sumY = 0.0
    sumXSqr = 0.0
    sumXY = 0.0
    for i = 1 to len5
        val = src5[len5 - i]
        per = i + 1.0
        sumX := sumX + per
        sumY := sumY + val
        sumXSqr := sumXSqr + per * per
        sumXY := sumXY + val * per

    slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX)
    average = sumY / len5
    intercept = average - slope * sumX / len5 + slope
    [slope, average, intercept]

var float tmp = na
[s, a, i] = calcSlope(src5, len5)

vwap1 = (i + s * (len5 - offset))
sdev = stdev(close, len5)
dev = multiplier * sdev
top = vwap1 + dev
bott = vwap1 - dev

z1 = vwap1 + dev
x1 = vwap1 - dev

low1 = crossover(close, x1)
high1 = crossunder(close, z1)

plotshape(low1, title="low", text="TP", color=color.red, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(high1, title="high", text="TP", color=color.green, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)  //plot for sell icon
// --- Second Part: CM_EMA Trend Bars ---

ema1 = input(34, minval=1, maxval=300, title="EMA UpTrend")
shema = input(true, title="Show EMA Trend is Based On?")

usedEma = ema(close, ema1)

emaUpColor() => hlc3 >= usedEma
emaDownColor() => hlc3 < usedEma

col_ema = hlc3 >= usedEma ? color.lime : hlc3 < usedEma ? color.red : color.white

barcolor(emaUpColor() ? color.lime : emaDownColor() ? color.red : na)
plot(shema and usedEma ? usedEma : na, title="EMA", style=plot.style_line, linewidth=3, color=col_ema)